In [1]:
using Ising,Gadfly,DataFrames,LaTeXStrings

Modelo de Ising en tres dimensiones

Christian Ladrón de Guevara

Lo primero es crear un ensamble


In [ ]:
ensamble = Ensamble((10,10,10),1/2.0)

Ajustar sus parámetros y ejecutar unos pasos, el resultado es un diccionario con los valores de Magnetización total y Energía.


In [49]:
ensamble.β=1/2.0
correSweeps(ensamble,800)


Out[49]:
Dict{Any,Any} with 2 entries:
  "M" => [972.0,984.0,994.0,996.0,994.0,992.0,994.0,992.0,988.0,986.0,990.0,996…
  "E" => [-2848.0,-2904.0,-2964.0,-2976.0,-2968.0,-2952.0,-2964.0,-2952.0,-2936…

In [2]:
Ls=[8:3:17]
df=Array(Any,length(Ls))
for i in 1:length(Ls)
    resultados = open("resultadosSinCampo"*string(Ls[i])*".serial")
    resultadoDeserializado=deserialize(resultados)
    close(resultados)
    resultadoDiccionario=Dict{ASCIIString,Any}(resultadoDeserializado)
    df[i]=DataFrame(t=resultadoDiccionario["Ts"],M=reshape(resultadoDiccionario["Magnetizaciones"][1,:],length(resultadoDiccionario["Ts"])),
    L=string(resultadoDiccionario["Ls"][1])* "^3")
end
df = vcat(df...);
set_default_plot_size(24cm, 16cm)

Modelo de Ising 3D sin campo Magnético

Prepara muchas ejecuciones, se barren las temperaturas entre 3.5 y 4.7 en pasos de 0.012, para sistemas de tamaños 8x8x8, 11x11x11,14x14x14 y 17x17x17.

De los datos obtenidos de cada simulación se calcula la magnetización por espín y el calor específico


In [3]:
elplot=plot(df,x="t",y="M",color="L",Geom.line,Scale.color_discrete,Guide.xlabel("Temperatura"),Guide.ylabel("Magnetización"))


Out[3]:
Temperatura 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5 6.0 6.5 7.0 2.00 2.05 2.10 2.15 2.20 2.25 2.30 2.35 2.40 2.45 2.50 2.55 2.60 2.65 2.70 2.75 2.80 2.85 2.90 2.95 3.00 3.05 3.10 3.15 3.20 3.25 3.30 3.35 3.40 3.45 3.50 3.55 3.60 3.65 3.70 3.75 3.80 3.85 3.90 3.95 4.00 4.05 4.10 4.15 4.20 4.25 4.30 4.35 4.40 4.45 4.50 4.55 4.60 4.65 4.70 4.75 4.80 4.85 4.90 4.95 5.00 5.05 5.10 5.15 5.20 5.25 5.30 5.35 5.40 5.45 5.50 5.55 5.60 5.65 5.70 5.75 5.80 5.85 5.90 5.95 6.00 6.05 6.10 6.15 6.20 6.25 6.30 6.35 6.40 6.45 6.50 0 2 4 6 8 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 4.0 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 5.0 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 6.0 6.1 6.2 6.3 6.4 6.5 8^3 11^3 14^3 17^3 L -1.25 -1.00 -0.75 -0.50 -0.25 0.00 0.25 0.50 0.75 1.00 1.25 1.50 1.75 2.00 2.25 -1.00 -0.95 -0.90 -0.85 -0.80 -0.75 -0.70 -0.65 -0.60 -0.55 -0.50 -0.45 -0.40 -0.35 -0.30 -0.25 -0.20 -0.15 -0.10 -0.05 0.00 0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00 -1 0 1 2 -1.0 -0.9 -0.8 -0.7 -0.6 -0.5 -0.4 -0.3 -0.2 -0.1 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0 Magnetización

In [4]:
Ls=[8:3:17]
df=Array(Any,length(Ls))
for i in 1:length(Ls)
    resultados = open("resultadosSinCampo"*string(Ls[i])*".serial")
    resultadoDeserializado=deserialize(resultados)
    close(resultados)
    resultadoDiccionario=Dict{ASCIIString,Any}(resultadoDeserializado)
    df[i]=DataFrame(t=resultadoDiccionario["Ts"],M=reshape(resultadoDiccionario["calores"][1,:],length(resultadoDiccionario["Ts"])),
    L=string(resultadoDiccionario["Ls"][1])* "^3")
end
df = vcat(df...);

In [5]:
elplot=plot(df,x="t",y="M",color="L",Geom.line,Scale.color_discrete,Guide.xlabel("Temperatura"),Guide.ylabel("Calor específico"))


Out[5]:
Temperatura 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5 6.0 6.5 7.0 2.00 2.05 2.10 2.15 2.20 2.25 2.30 2.35 2.40 2.45 2.50 2.55 2.60 2.65 2.70 2.75 2.80 2.85 2.90 2.95 3.00 3.05 3.10 3.15 3.20 3.25 3.30 3.35 3.40 3.45 3.50 3.55 3.60 3.65 3.70 3.75 3.80 3.85 3.90 3.95 4.00 4.05 4.10 4.15 4.20 4.25 4.30 4.35 4.40 4.45 4.50 4.55 4.60 4.65 4.70 4.75 4.80 4.85 4.90 4.95 5.00 5.05 5.10 5.15 5.20 5.25 5.30 5.35 5.40 5.45 5.50 5.55 5.60 5.65 5.70 5.75 5.80 5.85 5.90 5.95 6.00 6.05 6.10 6.15 6.20 6.25 6.30 6.35 6.40 6.45 6.50 0 2 4 6 8 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 4.0 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 5.0 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 6.0 6.1 6.2 6.3 6.4 6.5 8^3 11^3 14^3 17^3 L -3.0 -2.5 -2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5 -2.5 -2.4 -2.3 -2.2 -2.1 -2.0 -1.9 -1.8 -1.7 -1.6 -1.5 -1.4 -1.3 -1.2 -1.1 -1.0 -0.9 -0.8 -0.7 -0.6 -0.5 -0.4 -0.3 -0.2 -0.1 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 4.0 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 5.0 -2.5 0.0 2.5 5.0 -2.6 -2.4 -2.2 -2.0 -1.8 -1.6 -1.4 -1.2 -1.0 -0.8 -0.6 -0.4 -0.2 0.0 0.2 0.4 0.6 0.8 1.0 1.2 1.4 1.6 1.8 2.0 2.2 2.4 2.6 2.8 3.0 3.2 3.4 3.6 3.8 4.0 4.2 4.4 4.6 4.8 5.0 Calor específico

Modelo de Ising 3D con campo Magnético

Prepara muchas ejecuciones, se barren las temperaturas entre 2.0 y 8.0 en pasos de 0.4, para sistemas de tamaños 5x5x5,9x9x9,13x13x13 y 17x17x17.

Se define el valor de el campo magnético en el campo H del objeto tipo Ensamble

De los datos obtenidos de cada simulación se calcula la magnetización por espín y el calor específico


In [6]:
m = open("resultadosConCampo.serial")
n=deserialize(m)
close(m)
d=Dict{ASCIIString,Any}(n)
df=Array(Any,length(d["Ls"]))
for i in 1:length(d["Ls"])
    df[i]=DataFrame(t=d["Ts"],M=reshape(d["Magnetizaciones"][i,:],length(d["Ts"])),L=d["Ls"][i])
end
df = vcat(df...);

In [7]:
elplot=plot(df,x="t",y="M",color="L",Geom.line,Scale.color_discrete,Guide.xlabel("Temperatura"),Guide.ylabel("Magnetización"))


Out[7]:
Temperatura -15 -10 -5 0 5 10 15 20 25 -10.0 -9.5 -9.0 -8.5 -8.0 -7.5 -7.0 -6.5 -6.0 -5.5 -5.0 -4.5 -4.0 -3.5 -3.0 -2.5 -2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5 6.0 6.5 7.0 7.5 8.0 8.5 9.0 9.5 10.0 10.5 11.0 11.5 12.0 12.5 13.0 13.5 14.0 14.5 15.0 15.5 16.0 16.5 17.0 17.5 18.0 18.5 19.0 19.5 20.0 -10 0 10 20 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 5 9 13 17 L -1.25 -1.00 -0.75 -0.50 -0.25 0.00 0.25 0.50 0.75 1.00 1.25 1.50 1.75 2.00 2.25 -1.00 -0.95 -0.90 -0.85 -0.80 -0.75 -0.70 -0.65 -0.60 -0.55 -0.50 -0.45 -0.40 -0.35 -0.30 -0.25 -0.20 -0.15 -0.10 -0.05 0.00 0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00 -1 0 1 2 -1.0 -0.9 -0.8 -0.7 -0.6 -0.5 -0.4 -0.3 -0.2 -0.1 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0 Magnetización

In [8]:
m = open("resultadosConCampo.serial")
n=deserialize(m)
close(m)
d=Dict{ASCIIString,Any}(n)
df=Array(Any,length(d["Ls"]))
for i in 1:length(d["Ls"])
    df[i]=DataFrame(t=d["Ts"],M=reshape(d["calores"][i,:],length(d["Ts"])),L=d["Ls"][i])
end
df = vcat(df...);

In [9]:
elplot=plot(df,x="t",y="M",color="L",Geom.line,Scale.color_discrete,Guide.xlabel("Temperatura"),Guide.ylabel("Calor específico"))


Out[9]:
Temperatura -15 -10 -5 0 5 10 15 20 25 -10.0 -9.5 -9.0 -8.5 -8.0 -7.5 -7.0 -6.5 -6.0 -5.5 -5.0 -4.5 -4.0 -3.5 -3.0 -2.5 -2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5 6.0 6.5 7.0 7.5 8.0 8.5 9.0 9.5 10.0 10.5 11.0 11.5 12.0 12.5 13.0 13.5 14.0 14.5 15.0 15.5 16.0 16.5 17.0 17.5 18.0 18.5 19.0 19.5 20.0 -10 0 10 20 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 5 9 13 17 L -1.5 -1.0 -0.5 0.0 0.5 1.0 1.5 2.0 2.5 -1.00 -0.95 -0.90 -0.85 -0.80 -0.75 -0.70 -0.65 -0.60 -0.55 -0.50 -0.45 -0.40 -0.35 -0.30 -0.25 -0.20 -0.15 -0.10 -0.05 0.00 0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70 1.75 1.80 1.85 1.90 1.95 2.00 -1 0 1 2 -1.0 -0.9 -0.8 -0.7 -0.6 -0.5 -0.4 -0.3 -0.2 -0.1 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0 Calor específico

Magnetización vs Sweeps


In [10]:
ensamble = Ensamble((10,10,10),0.5)
Hs = 1.05:0.075:1.65
sweeps = 900
ensamble.β = 0.5
function magnetos(ensamble::Ensamble,Hs::Array{Float64},sweeps::Integer)
    Ms = zeros(length(Hs),int(sweeps/10))
  for H in 1:length(Hs)
        ensamble.H = Hs[H]
        ensamble.configuración = -1 * ones(17,17,17)
      for i in 1:sweeps/10
            Ms[H,i] = magnetizaciónensamble(ensamble)/length(ensamble.configuración)
            correSweeps(ensamble,10)
      end
  end
    return Ms
end
Ms = magnetos(ensamble,[Hs],sweeps)
dfs = DataFrame[]
for i in 1:size(Ms)[1]
    df = DataFrame(sweeps=[10*(1:size(Ms)[2])],M=reshape(Ms[i,:],size(Ms)[2]),H=Hs[i])
    push!(dfs,df)
end
datos = vcat(dfs);

In [11]:
plot(datos,x="sweeps",y="M",color="H",Geom.line,Scale.color_discrete)


Out[11]:
sweeps -1500 -1000 -500 0 500 1000 1500 2000 2500 -1000 -950 -900 -850 -800 -750 -700 -650 -600 -550 -500 -450 -400 -350 -300 -250 -200 -150 -100 -50 0 50 100 150 200 250 300 350 400 450 500 550 600 650 700 750 800 850 900 950 1000 1050 1100 1150 1200 1250 1300 1350 1400 1450 1500 1550 1600 1650 1700 1750 1800 1850 1900 1950 2000 -1000 0 1000 2000 -1000 -900 -800 -700 -600 -500 -400 -300 -200 -100 0 100 200 300 400 500 600 700 800 900 1000 1100 1200 1300 1400 1500 1600 1700 1800 1900 2000 1.05 1.125 1.2 1.275 1.35 1.425 1.5 1.575 1.65 H -3.5 -3.0 -2.5 -2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 -3.0 -2.9 -2.8 -2.7 -2.6 -2.5 -2.4 -2.3 -2.2 -2.1 -2.0 -1.9 -1.8 -1.7 -1.6 -1.5 -1.4 -1.3 -1.2 -1.1 -1.0 -0.9 -0.8 -0.7 -0.6 -0.5 -0.4 -0.3 -0.2 -0.1 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3.0 -4 -2 0 2 4 -3.0 -2.8 -2.6 -2.4 -2.2 -2.0 -1.8 -1.6 -1.4 -1.2 -1.0 -0.8 -0.6 -0.4 -0.2 0.0 0.2 0.4 0.6 0.8 1.0 1.2 1.4 1.6 1.8 2.0 2.2 2.4 2.6 2.8 3.0 M

Visualización 3D


In [ ]:
a = Ensamble((17,17,17),0.5)
a.H=1.3
a.configuración= -1*ones(17,17,17);
microestado=reshape(a.configuración,length(a.configuración));
ar = open("pruebasAnima.dat","w")
for i in 1:370
    correSweeps(a,1)
    write(ar,string(microestado))
    write(ar,'\n')
end
close(ar)
#Para crear el video se ejecuta
#python cubo.py
#rm imagenesVideo/Ising3D.webm
#ffmpeg -framerate 5 -i imagenesVideo/frame%06d.png -c:v libvpx imagenesVideo/Ising3D.webm

In [12]:
vid = open("imagenesVideo/Ising3D.webm","r")
vide = readbytes(vid)
vide64=base64(vide)
close(vid)

Simulación de un sistema de 17$^3$ con un campo H=1.35


In [13]:
display("text/html","<video controls> <source type=\"video/webm\" src=\"data:video/webm;base64,"*string(vide64)*"\"> </video>")